iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0

今天來簡單的介紹一下進制轉換的概念
以我們生活日常所使用的不外乎就是熟悉的十進制(Decimal)
而在計算機處理上又或者是演算法...etc都是以二進制(010101000...)來處理
還記得小時候看到010101的場景就是在電影駭客任務中(?)
但大概那時候也看不懂是什麼 (現在也是)
因此才需要進制轉換
而進制轉換中的規則可以區分為兩個

  • 1.餘數乘積法 (其他進制轉十進制)
  • 2.指數加權法 (十進制轉其他進制)

下方有簡易的例子供參考

https://ithelp.ithome.com.tw/upload/images/20220920/20152495bUXZFQGH2Q.jpg

然而如何將此邏輯換到C呢
以下有實例
也是拆成其他進制轉十進制
或者拆成十進制轉其他進制

因此這邊先暫時用1和2來分辨要做十進制轉X進制或X進制轉十進制
Ex: input:
1
16 1234
Output:
4D2
Ex: input:
2
9 1234
Output:
922

10進制轉X進制
void transform10X(int base,int x){
    int num=x,index=1,ans=0;

    while(num>=base){
        num = num/base;
        index = index*base;
    }

    while(index>0){
        ans = x/index;
        x = x-(index*ans);
        index = index/base;
        printf("%c",ans<10?('0'+ans):('A'+(ans-10)));

    }
    printf("\n");
    return;
}

於X進制轉10進制
這邊小弟使用的方法稍微麻煩一點繞了一下
由於X進制中必須考慮到'A''B''C''D''E''F'的存在
因此在輸入時必須以字元的方式存取 (稀疏記得有更好的方法但好像是別的語言的事)
而收到以後再以ans[i]拆成各別元素以便之後計算
其實在收到輸入以後就可以先以ASCII的方式先判別該字元是對應到的十進制
但因為我忘了所以就先這樣XD(忘記還講這麼大聲)

X進制轉10進制
void transformX10(){
    int base=0,i=0,j=0,k=0;
    double temp=0.0,total=0.0;
    char ans[100]={'\0'};
    char x;
    scanf("%d ",&base);
    while(x!='\n'){
        scanf("%c",&x);
        ans[i]=x;
        i++;
    }
    i--;
    while(i!=0){

        temp = temp + ans[j];
        printf("i=%d \n",i);
        if(ans[j]<=57){

            total = total+ (ans[j]-48)*pow(base,i-1);
 
        }
        else if(ans[j]<=70){
            total = total+ (ans[j]-55)*pow(base,i-1);

        }
        j++;
        i--;
    }
    printf("%d",total);
}
int main(){
    int x=0,base=0,opt=0;
    scanf("%d",&opt);
    if(opt==1){
        scanf("%d %d",&base,&x);
        transform10X(base,x);
    }
    else if(opt==2){
        transformX10();
    }
    return 0;
}

上一篇
[Day4]有限狀態機-Finite-state machine
下一篇
[Day6]指標(Pointer)
系列文
環島C一下自己的人生24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言